/**
 * 死亡之组两个条件，或者的关系：
 * 1. 两个队的实力大于等于L，或者更多队
 * 2. 最大最小差小于等于D
 * 问能否将1号队伍分到不是死亡之组
 * 
 * 贪心构造即可，尽量选实力差的，并且选一个最大值即可。
 * 分两种情况：
 * 1. 如果A1本身大于等于L，则直接选最小的三个
 * 2. 如果A1本身小于L，则选最小的两个，再选一个最大值
 * 
 * 然后检查第二个条件即可。
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;


using llt = long long;
using vi = vector<int>;


int N, L, D;
vi A;

bool check(array<int, 4> & a){
    sort(a.begin(), a.end());
#ifndef ONLINE_JUDGE
    for(auto i : a) cout << i << " "; cout << endl;
#endif

    if(a[3] - a[0] <= D) return false;

    int c = 0;
    for(auto i : a) if(i >= L) c += 1;
    if(c >= 2) return false;

    return true;
}

bool proc(){
    map<int, int> Map;
    for(int i=2;i<=N;++i)Map[A[i]] += 1;

    array<int, 4> a{A[1], 0, 0, 0};
    if(A[1] >= L){
        int left = 3;
        int idx = 1;
        for(const auto & p : Map){
            int t = p.second;
            if(t >= left) t = left;
            for(int i=idx,j=0;j<t;++i,++j){
                a[i] = p.first;
            }
            left -= t;
            idx += t;
            if(0 == left) break;
        }
    }else{
        a[1] = Map.rbegin()->first;
        Map.rbegin()->second -= 1;

        int left = 2;
        int idx = 2;
        for(const auto & p : Map){
            int t = p.second;
            if(t >= left) t = left;
            for(int i=idx,j=0;j<t;++i,++j){
                a[i] = p.first;
            }
            left -= t;
            idx += t;
            if(0 == left) break;
        }        
    }
    return check(a);
}

void work(){ 
    cin >> N >> L >> D;
    A.assign(N + 1, {});
    for(int i=1;i<=N;++i) cin >> A[i];
    cout << (proc() ? "Yes\n" : "No\n");
	return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
    int nofkase = 1;
	cin >> nofkase;
	while(nofkase--) work();
	return 0;
}